# install.packages("keras")
# library(keras)
# install_keras()

Libraries

library(quantmod)
library(tseries)
library(timeSeries)
library(forecast)
library(xts)
library(dplyr)
df <- read.csv("./data/bitcoin_coinbase_M5.csv", sep = "\t", header = TRUE)
df2 <- read.csv("./data/btc-out.csv", sep = "\t", header = TRUE)
head(df2)
df$DateTime_UTC <- as.POSIXct(df$DateTime_UTC)
df2$DateTime_UTC <- as.POSIXct(df2$DateTime_UTC)
# quantiles ==== [(-42.016, -0.185], (-0.185, -0.0749], (-0.0749, -0.0298], (-0.0298, -0.00504], (-0.00504, 0.0], (0.0, 0.0131], (0.0131, 0.0394], (0.0394, 0.085], (0.085, 0.19], (0.19, 67.889]
head(df)
data <- df2
N <- nrow(data)
plot(data$price_close, type = "l")

plot(diff(data$price_close), type = "l", main = "Original data")

plot(diff(log(ms)), type = "l", main = "Log-transformed data")
Error in diff(log(ms)) : object 'ms' not found

make_aic_table <- function(data, P_end, Q_end, P_start = 0, Q_start = 0){
  table <- matrix(NA,(P_end-P_start+1),(Q_end-Q_start+1))
  for(p in P_start:P_end) {
    for(q in Q_start:Q_end) {
      cat(paste0("\rP: ", p, " and Q: ", q))
       table[p-P_start+1,q-Q_start+1] <- arima(data,order=c(p,0,q))$aic
    }
  }
  dimnames(table) <- list(paste("<b> AR",P_start:P_end, "</b>", sep=""),paste("MA",Q_start:Q_end,sep=""))
  table
}
table(aic_table(ms_df,40,40),digits=2)
spfinal.aic <- Inf
spfinal.order <- c(0,0,0)
for (i in 0:4) for (j in 0:4) {
  print(paste0("Testing i: ", i, " and j: ", j))
  spcurrent.aic <- AIC(arima(ms_df, order=c(i, 0, j)))
  if (spcurrent.aic < spfinal.aic) {
    spfinal.aic <- spcurrent.aic
    spfinal.order <- c(i, 0, j)
  }
}
spfinal.order
[1] 4 0 4
make_aic_table(ms_df, 7, 7, 4, 4)

P: 4 and Q: 4
P: 4 and Q: 5
m1_arima <- arima(price_close, order=c(30, 0, 30))
Error in optim(init[mask], armafn, method = optim.method, hessian = TRUE,  : 
  non-finite finite-difference value [10]
m2_arima <- arima(price_close, 7, 0, 7)
# Pull data from Yahoo finance 
getSymbols('TECHM.NS', from='2012-01-01', to='2015-01-01')

# Select the relevant close price series
stock_prices = TECHM.NS[,4]
In the next step, we compute the logarithmic returns of the stock as we want the ARIMA model to forecast the log returns and not the stock price. We also plot the log return series using the plot function.

# Compute the log returns for the stock
stock = diff(log(stock_prices),lag=1)
stock = stock[!is.na(stock)]

# Plot log returns 
plot(stock,type='l', main='log returns plot')
adf.test(y, alternative = "stationary")
Error in NCOL(x) : object 'y' not found
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJrZXJhcyIpCiMgbGlicmFyeShrZXJhcykKIyBpbnN0YWxsX2tlcmFzKCkKCmBgYAoKIyBMaWJyYXJpZXMKYGBge3J9CmxpYnJhcnkocXVhbnRtb2QpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeSh0aW1lU2VyaWVzKQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KHh0cykKbGlicmFyeShkcGx5cikKCmBgYAoKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCIuL2RhdGEvYml0Y29pbl9jb2luYmFzZV9NNS5jc3YiLCBzZXAgPSAiXHQiLCBoZWFkZXIgPSBUUlVFKQpkZjIgPC0gcmVhZC5jc3YoIi4vZGF0YS9idGMtb3V0LmNzdiIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFRSVUUpCmhlYWQoZGYyKQpgYGAKCmBgYHtyfQpkZiREYXRlVGltZV9VVEMgPC0gYXMuUE9TSVhjdChkZiREYXRlVGltZV9VVEMpCmRmMiREYXRlVGltZV9VVEMgPC0gYXMuUE9TSVhjdChkZjIkRGF0ZVRpbWVfVVRDKQojIHF1YW50aWxlcyA9PT09IFsoLTQyLjAxNiwgLTAuMTg1XSwgKC0wLjE4NSwgLTAuMDc0OV0sICgtMC4wNzQ5LCAtMC4wMjk4XSwgKC0wLjAyOTgsIC0wLjAwNTA0XSwgKC0wLjAwNTA0LCAwLjBdLCAoMC4wLCAwLjAxMzFdLCAoMC4wMTMxLCAwLjAzOTRdLCAoMC4wMzk0LCAwLjA4NV0sICgwLjA4NSwgMC4xOV0sICgwLjE5LCA2Ny44ODldCmhlYWQoZGYpCmBgYAoKCmBgYHtyfQpkYXRhIDwtIGRmMgpOIDwtIG5yb3coZGF0YSkKcGxvdChkYXRhJHByaWNlX2Nsb3NlLCB0eXBlID0gImwiKQpgYGAKCmBgYHtyfQpwbG90KGRpZmYoZGF0YSRwcmljZV9jbG9zZSksIHR5cGUgPSAibCIsIG1haW4gPSAiT3JpZ2luYWwgZGF0YSIpCgpgYGAKCgpgYGB7cn0KIyBwbG90KGRpZmYobG9nKG1zKSksIHR5cGUgPSAibCIsIG1haW4gPSAiTG9nLXRyYW5zZm9ybWVkIGRhdGEiKQoKYGBgCgpgYGB7cn0KcGxvdChkaWZmKHNxcnQobXMpKSwgdHlwZSA9ICJsIiwgbWFpbiA9ICJTcXVhcmUgcm9vdCB0cmFuc2Zvcm1lZCBkYXRhIikKCmBgYAoKCmBgYHtyfQpzdGF0czo6YWNmKGRpZmYobG9nKGRhdGEkcHJpY2VfY2xvc2UpKSkKCmBgYAoKYGBge3J9Cm1zX2RmIDwtIGRpZmYobG9nKGRhdGEkcHJpY2VfY2xvc2UpKQojbXNfdHMgPC0gdHMobXNfZGYsZnJlcXVlbmN5ID0gMzY1LHN0YXJ0ID0gMjAxNSApCiNwbG90KG1zX3RzKQojbXNfZGUgPC0gZGVjb21wb3NlKG1zX3RzKQojcGxvdChtc19kZSkKYGBgCgpgYGB7cn0KbWFrZV9haWNfdGFibGUgPC0gZnVuY3Rpb24oZGF0YSwgUF9lbmQsIFFfZW5kLCBQX3N0YXJ0ID0gMCwgUV9zdGFydCA9IDApewogIHRhYmxlIDwtIG1hdHJpeChOQSwoUF9lbmQtUF9zdGFydCsxKSwoUV9lbmQtUV9zdGFydCsxKSkKICBmb3IocCBpbiBQX3N0YXJ0OlBfZW5kKSB7CiAgICBmb3IocSBpbiBRX3N0YXJ0OlFfZW5kKSB7CiAgICAgIGNhdChwYXN0ZTAoIlxyUDogIiwgcCwgIiBhbmQgUTogIiwgcSkpCiAgICAgICB0YWJsZVtwLVBfc3RhcnQrMSxxLVFfc3RhcnQrMV0gPC0gYXJpbWEoZGF0YSxvcmRlcj1jKHAsMCxxKSkkYWljCiAgICB9CiAgfQogIGRpbW5hbWVzKHRhYmxlKSA8LSBsaXN0KHBhc3RlKCI8Yj4gQVIiLFBfc3RhcnQ6UF9lbmQsICI8L2I+Iiwgc2VwPSIiKSxwYXN0ZSgiTUEiLFFfc3RhcnQ6UV9lbmQsc2VwPSIiKSkKICB0YWJsZQp9CmBgYAoKYGBge3J9CiMgdGFibGUoYWljX3RhYmxlKG1zX2RmLDQwLDQwKSxkaWdpdHM9MikKCmBgYAoKYGBge3J9CnNwZmluYWwuYWljIDwtIEluZgpzcGZpbmFsLm9yZGVyIDwtIGMoMCwwLDApCmZvciAoaSBpbiAwOjQpIGZvciAoaiBpbiAwOjQpIHsKICBwcmludChwYXN0ZTAoIlRlc3RpbmcgaTogIiwgaSwgIiBhbmQgajogIiwgaikpCiAgc3BjdXJyZW50LmFpYyA8LSBBSUMoYXJpbWEobXNfZGYsIG9yZGVyPWMoaSwgMCwgaikpKQogIGlmIChzcGN1cnJlbnQuYWljIDwgc3BmaW5hbC5haWMpIHsKICAgIHNwZmluYWwuYWljIDwtIHNwY3VycmVudC5haWMKICAgIHNwZmluYWwub3JkZXIgPC0gYyhpLCAwLCBqKQogIH0KfQpgYGAKCmBgYHtyfQpzcGZpbmFsLm9yZGVyCiMgNCwwLDQKYGBgCgpgYGB7cn0Kc3BmaW5hbC5haWMgPC0gSW5mCnNwZmluYWwub3JkZXIgPC0gYygwLDAsMCkKbWFrZV9haWNfdGFibGUobXNfZGYsIDcsIDcsIDQsIDQpCmBgYAoKYGBge3J9CnByaWNlX2Nsb3NlIDwtIGRhdGEkcHJpY2VfY2xvc2UgJT4lIGxvZygpICU+JSBkaWZmKGxhZyA9IDEpCm0xX2FyaW1hIDwtIGFyaW1hKHByaWNlX2Nsb3NlLCBvcmRlcj1jKDMwLCAwLCAzMCkpCmFyaW1hCmBgYAoKYGBge3J9Cm0yX2FyaW1hIDwtIGFyaW1hKHByaWNlX2Nsb3NlLCA3LCAwLCA3KQpgYGAKCgoKCmBgYHtyfQojIFB1bGwgZGF0YSBmcm9tIFlhaG9vIGZpbmFuY2UgCmdldFN5bWJvbHMoJ1RFQ0hNLk5TJywgZnJvbT0nMjAxMi0wMS0wMScsIHRvPScyMDE1LTAxLTAxJykKCiMgU2VsZWN0IHRoZSByZWxldmFudCBjbG9zZSBwcmljZSBzZXJpZXMKc3RvY2tfcHJpY2VzID0gVEVDSE0uTlNbLDRdCkluIHRoZSBuZXh0IHN0ZXAsIHdlIGNvbXB1dGUgdGhlIGxvZ2FyaXRobWljIHJldHVybnMgb2YgdGhlIHN0b2NrIGFzIHdlIHdhbnQgdGhlIEFSSU1BIG1vZGVsIHRvIGZvcmVjYXN0IHRoZSBsb2cgcmV0dXJucyBhbmQgbm90IHRoZSBzdG9jayBwcmljZS4gV2UgYWxzbyBwbG90IHRoZSBsb2cgcmV0dXJuIHNlcmllcyB1c2luZyB0aGUgcGxvdCBmdW5jdGlvbi4KCiMgQ29tcHV0ZSB0aGUgbG9nIHJldHVybnMgZm9yIHRoZSBzdG9jawpzdG9jayA9IGRpZmYobG9nKHN0b2NrX3ByaWNlcyksbGFnPTEpCnN0b2NrID0gc3RvY2tbIWlzLm5hKHN0b2NrKV0KCiMgUGxvdCBsb2cgcmV0dXJucyAKcGxvdChzdG9jayx0eXBlPSdsJywgbWFpbj0nbG9nIHJldHVybnMgcGxvdCcpCgpgYGAKCmBgYHtyfQp5IDwtIGRpZmYobG9nKGRmJHByaWNlX2Nsb3NlKSkKCmFkZi50ZXN0KHksIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQptX2FyaW1hIDwtIGF1dG8uYXJpbWEoeSwgbWF4LnAgPSApCj9hdXRvLmFyaW1hCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=